const jwt = require('jsonwebtoken');
const { JWT_SECRET, enableCookieAuth } = require('../config/system');
const { errorWithCode, error } = require('../utils/resultwrapper');

// 白名单路径列表
const whiteList = [
    '/login',  // 登录接口
    '/captcha', // 验证码接口
];

const authMiddleware = (req, res, next) => {
    // 检查路径是否在白名单中的辅助函数
    const isPathInWhitelist = (requestPath) => {
        return whiteList.some(path => {
            // 确保完全匹配路径或者是子路径
            return requestPath === path || requestPath.startsWith(`${path}/`);
        });
    };

    // 从请求中获取token的辅助函数
    const extractToken = (req) => {
        // 优先从cookie中获取token
        let token = req.cookies['node-gis-admin-token'];
        
        // 如果cookie中没有token，尝试从请求头获取
        if (!token) {
            token = req.headers['authorization'];
        }
        
        // 如果找到token，处理Bearer前缀
        if (token) {
            return token.startsWith('Bearer ') ? token.slice(7) : token;
        }
        
        return null;
    };

    // 检查请求路径是否在白名单中
    if (isPathInWhitelist(req.path)) {
        return next();
    }

    // 如果未启用cookie认证，直接放行请求
    if (!enableCookieAuth) {
        return next();
    }

    // 获取并验证token
    const token = extractToken(req);
    if (!token) {
        return res.json(errorWithCode(401, '未登录或token已过期'));
    }

    try {
        // 验证token
        const decoded = jwt.verify(token, JWT_SECRET);
        
        // 将用户信息添加到请求对象中
        req.user = decoded;
        
        next();
    } catch (err) {
        // 根据具体的错误类型返回相应的错误信息
        if (err instanceof jwt.TokenExpiredError) {
            return res.json(errorWithCode(401, 'token已过期'));
        } else if (err instanceof jwt.JsonWebTokenError) {
            return res.json(errorWithCode(401, '无效的token'));
        } else {
            return res.json(error('token验证失败'));
        }
    }
};

module.exports = authMiddleware;